package com.qf.spring2202.springmybatis.service.impl;

import com.qf.spring2202.springmybatis.dao.UserDao;
import com.qf.spring2202.springmybatis.entity.User;
import com.qf.spring2202.springmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.sql.SQLException;

@Service
public class UserServiceImpl implements UserService {

    /**
     * 1. 根据类型自动装配
     * 2. 如果有多个类型匹配的bean，那么根据 属性名查询是否有bean的名字（id）与属性名相同，如果有，则注入
     * 3. 如果都没有则注入失败
     *
     * 4. 或者使用 @Qualifier("userDaoImpl") 自己指定bean的名字
     */
    @Autowired
    private UserDao userDao;

    @Transactional(propagation = Propagation.SUPPORTS)  // 事务控制注解，查询这么配
    @Override
    public User getUser(Integer id) {

        System.out.println("UserServiceImpl 查询用户id="+id);

//        System.out.println(userDao.getUserById(id));

//        System.out.println(userDao.getUserById(30));

        return userDao.getUserById(id);
    }


    @Transactional(rollbackFor = Exception.class)  // 事务控制注解 ， 增删改使用这个配置
    @Override
    public Integer createUser(User user) {
        userDao.insertUser(user);
//        int a = 1/0;
        userDao.insertUser(user);
        return 2;
    }

    @Override
    public void sleep() {
        userDao.sleep();
    }

    /**
     * 测试当发生 CheckException 类的异常时，会不会回顾
     */
    @Override
    public void testExRollback(User user) throws SQLException {


        userDao.insertUser(user);

        if (true) { // 骗过编译器
            throw new SQLException();
        }

        userDao.insertUser(user);


    }


}
